/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controle.gui.frames.internos.superclasses;

import controle.gui.utils.ApagaElementosDaInterface;
import controle.gui.utils.ComboBoxUtils;
import controle.gui.utils.EnabledGUIElements;
import java.awt.Component;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.TreeSet;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import modelo.Agente;
import modelo.Localidade;
import modelo.Municipio;
import modelo.Quadra;
import modelo.Visitapesquisa;
import modelo.Visitatratamento;
import persistencia.dao.AbstractDAO;

/**
 *
 * @author Administrador
 */
public abstract class ControleBoletins extends Controle {

    public ControleBoletins(Component parentComponent) {
        super(parentComponent);
    }

    /**
     * Evento da tabela de visitas
     */
    public void consultaTabelaVisitas(java.awt.event.MouseEvent evt) {

        //Verifica se foram dados 2 clicks do mouse durante o evento
        if (evt.getClickCount() == 2) {

            //Abre o frame da Visita
            this.editarVisita();

        }
    }

    /**
     * Verifica se a quadra consultada já foi concluida no boletim atual em outra visita
     * @return false - a quadra não foi concluída 
     * @return true - a quadra foi concluída
     */
    protected boolean verificaQuadraConcluida(TreeSet setVisitas, Quadra quadraConsultada, Integer idVisitaAtual) {

        for (Iterator it = setVisitas.iterator(); it.hasNext();) {
            Object obj = it.next();
            if (obj instanceof Visitapesquisa) {
                Visitapesquisa vis = (Visitapesquisa) obj;
                if (vis.isQuadraConcluida()
                        && (vis.getQuadra().getIdQuadra().equals(quadraConsultada.getIdQuadra()))) {
                    if (idVisitaAtual != null && vis.getIdVisitaPesquisa() != null && 
                            !idVisitaAtual.equals(vis.getIdVisitaPesquisa())) {
                        return true;
                    } else if(idVisitaAtual == null || vis.getIdVisitaPesquisa() == null){
                        return true;
                    }
                }

            } else if (obj instanceof Visitatratamento) {
                Visitatratamento vis = (Visitatratamento) obj;
                if (vis.isQuadraConcluida()
                        && (vis.getQuadra().getIdQuadra().equals(quadraConsultada.getIdQuadra()))) {
                    if (idVisitaAtual != null && vis.getIdVisitaTratamento() != null && 
                            !idVisitaAtual.equals(vis.getIdVisitaTratamento())) {
                        return true;
                    } else if(idVisitaAtual == null || vis.getIdVisitaTratamento() == null){
                        return true;
                    }
                }
            }
        }

        return false;
    }

    /**
     * Verifica se na tabela de visitas já há uma última visita cadastrada
     *
     * @return false se não for econtrada a última visita, true se for
     * encontrada
     */
    protected boolean verificaUltimaVisitaTabela(DefaultTableModel modelo, Integer coluna) {

        //Percorre todas as linhas da tabela de visitas
        for (int index = 0; index < modelo.getRowCount(); index++) {
            //Verifica se a linha atual é da última visita
            if (modelo.getValueAt(index, coluna).toString().equals("Sim")) {
                return true;
            }
        }

        return false;
    }

    public abstract void editarVisita();

    public abstract DefaultTableModel getModelTabelaVisitas();

    public abstract Integer linhaSelecionadaTabelaVisitas();

    /**
     * Percorre todas as visitas da Gui e verifica se existe alguma duplicada
     * com
     *
     * @numeroAmostra
     *
     * @param numeroAmostra
     * @return
     */
    public static boolean verificaNumeroAmostraDuplicada(Visitapesquisa visita, Set<Visitapesquisa> setVisitas) {

        for (Iterator it = setVisitas.iterator(); it.hasNext();) {
            Visitapesquisa vis = (Visitapesquisa) it.next();
            if (((vis.getNumeroAmostra() != null && visita.getNumeroAmostra() != null) && vis.getNumeroAmostra().equals(visita.getNumeroAmostra()))
                    && (vis.getHora() != null && !vis.getHora().toString().equals(visita.getHora().toString()))) {
                return true;
            }
        }

        return false;
    }

    /**
     * Evento de textCodigoGRS
     *
     * @return
     */
    public boolean eventoTextCodigoGRS(JTextField textCodigoGRS, JTextField textNomeGRS) {

        //Busca o município pelo código digitado
        List<Municipio> listMun = this.getListMunicipio(textCodigoGRS.getText());

        //Verifica se o município foi encontrado
        if (listMun != null) {
            //Preenche os componentes
            textNomeGRS.setText(listMun.get(0).getNome());

            return true;
        }

        JOptionPane.showMessageDialog(parentComponent, "Município GRS não encontrado!", "Atenção!", JOptionPane.WARNING_MESSAGE);
        textNomeGRS.setText("");
        textCodigoGRS.setText("");

        return false;
    }

    /**
     * Evento de textBuscaCodigoMunicipio
     */
    public static boolean eventoTextCodigoMunicipio(JTextField textCodigoLocalidade, JComboBox comboLocalidade, JTextField textCodigoMunicipio, JTextField textNomeMunicipio,
            JTextField textTurma, JComboBox comboCordRegional) {

        String codigoMun = textCodigoMunicipio.getText().trim();

        //Verifica se o município existe
        List<Municipio> list = AbstractDAO.consultar("Municipio", "codigo='" + codigoMun + "'");
        if (list.size() > 0) {
            textNomeMunicipio.setText(list.get(0).getNome());
            EnabledGUIElements.enabledJComponent(textCodigoLocalidade, comboLocalidade);
            comboLocalidade.setModel(ComboBoxUtils.inicializaComboBoxEntidades("Selecione...", "Localidade where idMunicipio=" + list.get(0).getIdMunicipio(), "nome"));

            //Define o campo turma
            String turma = list.get(0).getCodigo().substring(2, list.get(0).getCodigo().length() - 1);
            textTurma.setText(turma);

            //Define o campo cordenador regional
            comboCordRegional.setSelectedItem(list.get(0).getEstado());

        } else {
            new ApagaElementosDaInterface().apagaJTextField(textCodigoLocalidade, textNomeMunicipio);
            new ApagaElementosDaInterface().apagaJComboBox(comboLocalidade);
            EnabledGUIElements.disabledJComponent(textCodigoLocalidade, comboLocalidade);
            JOptionPane.showMessageDialog(null, "Não existe nenhum município com este código.", "Código de município inexistente!",
                    JOptionPane.WARNING_MESSAGE);

            //Apaga o campo turma
            textTurma.setText("");

            //Apaga o campo cordenador regional
            comboCordRegional.setSelectedIndex(0);

            //Limpa o Model do comboBox de localidade
            comboLocalidade.setModel(new DefaultComboBoxModel(new String[]{"Selecione..."}));

            return false;
        }
        return true;
    }

    /**
     * evento do combobox com nome dos agentes ativos
     *
     * @return
     */
    public boolean eventoComboAgentes(JComboBox comboAgentes, JTextField textCodigoAgente) {

        //Verifica se o comoboBox foi selecionado corretamente
        if (comboAgentes.getSelectedIndex() != 0) {

            //Busca o agente
            List<Agente> listAge = this.getListAgente(comboAgentes.getSelectedItem().toString());
            if (listAge != null) {

                textCodigoAgente.setText(listAge.get(0).getCodigo().toString());

                return true;
            }

        } else {
            textCodigoAgente.setText("");
        }

        return false;
    }

    /**
     * Evento do textField de código de agentes
     *
     * @return
     */
    public boolean eventoTextCodigoAgentes(JTextField textCodigoAgente, JComboBox comboAgentes, boolean agenteInativo) {

        //Busca o agente pelo código digitado
        List<Agente> age = null;

        if (agenteInativo) {
            if (!textCodigoAgente.getText().trim().isEmpty()) {
                age = AbstractDAO.consultar("Agente", "codigo=" + textCodigoAgente.getText().trim() + " AND codigo!=0");
                if (age != null && age.size() > 1) {
                    JOptionPane.showMessageDialog(parentComponent, "Existe mais de um agente com este código (inativo), favor selecionar também o nome do agente correto.",
                            "Atenção!", JOptionPane.WARNING_MESSAGE);
                }
            }

        } else {
            age = AbstractDAO.consultar("Agente", "codigo=" + textCodigoAgente.getText().trim() + " AND codigo!=0  AND ativo=TRUE");

        }

        //Verifica se foi encontrado
        if (age != null && !age.isEmpty()) {
            //Seleciona o comboBox
            comboAgentes.setSelectedItem(age.get(0).getNome());

            return true;
        }

        JOptionPane.showMessageDialog(parentComponent, "Código de agente inexistente ou inativo!", "Atenção!", JOptionPane.WARNING_MESSAGE);
        comboAgentes.setSelectedIndex(0);

        return false;
    }

    /**
     * Evento do combo de localidades
     *
     * @param comboLocalidade
     */
    public boolean comboLocalidade(JComboBox comboLocalidade, JTextField textCodigoLocalidade, JTextField textCodigoMunicipio) {

        List<Municipio> list = AbstractDAO.consultar("Municipio", "codigo='" + textCodigoMunicipio.getText() + "'");

        if (list == null || list.isEmpty()) {
            return false;
        }

        String nomeLoc = comboLocalidade.getSelectedItem().toString();
        List<Localidade> listLoc = AbstractDAO.consultar("Localidade", "nome='" + nomeLoc + "' AND idMunicipio=" + list.get(0).getIdMunicipio());
        if (listLoc.size() > 0) {
            textCodigoLocalidade.setText(listLoc.get(0).getCodigo().toString());
        } else {
            textCodigoLocalidade.setText("");
        }

        return true;
    }

    /**
     * Evento de textBuscaCodigoLocalidade
     *
     * @return
     */
    public boolean textCodigoLocalidade(JTextField textCodigoLocalidade, JComboBox comboLocalidade, JTextField textCodigoMunicipio) {

        String codigoMun = textCodigoMunicipio.getText().trim();
        String codigoLoc = textCodigoLocalidade.getText().trim();

        //Verifica se o município existe
        List<Municipio> listMun = AbstractDAO.consultar("Municipio", "codigo='" + codigoMun + "'");
        if (listMun.isEmpty()) {
            JOptionPane.showMessageDialog(parentComponent, "Não existe nenhum município com este código.", "Código de município inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return false;
        }

        List<Localidade> list = AbstractDAO.consultar("Localidade", "codigo='" + codigoLoc + "' AND idMunicipio=" + listMun.get(0).getIdMunicipio());
        if (list.size() > 0) {
            comboLocalidade.setSelectedItem(list.get(0).getNome());


        } else {
            JOptionPane.showMessageDialog(parentComponent, "Não existe nenhuma localidade para este município com este código.", "Código de localidade inexistente!",
                    JOptionPane.WARNING_MESSAGE);
            return false;
        }
        return true;
    }
}
